rockchip: add an fdt parsing stub for platform param
authorHeiko Stuebner <[email protected]>
Thu, 7 Mar 2019 07:07:11 +0000 (08:07 +0100)
committerHeiko Stuebner <[email protected]>
Thu, 14 Mar 2019 21:45:15 +0000 (22:45 +0100)
The Rockchip ATF platform can be entered from both Coreboot and U-Boot.
While Coreboot does submit the list of linked parameter structs as
platform param, upstream u-boot actually always provides a pointer
to a devicetree as parameter.
This results in current ATF not running at all when started from U-Boot.

To fix this, add a stub that checks if the parameter is a fdt so we
can at least boot and not get stuck. Later on we can extend this with
actual parsing of information from the devicetree.

Signed-off-by: Heiko Stuebner <[email protected]>
Cc: Philipp Tomsich <[email protected]>
plat/rockchip/common/params_setup.c
plat/rockchip/rk3328/platform.mk
plat/rockchip/rk3368/platform.mk
plat/rockchip/rk3399/platform.mk

index 3d1b40b3ffc04fe9012879adab588ea65af14f51..dda98d962bb68e85293fd09e365b2c80fa3283bc 100644 (file)
@@ -11,6 +11,7 @@
 #include <common/debug.h>
 #include <drivers/console.h>
 #include <drivers/gpio.h>
+#include <libfdt.h>
 #include <lib/coreboot.h>
 #include <lib/mmio.h>
 #include <plat/common/platform.h>
@@ -27,6 +28,13 @@ static struct gpio_info suspend_gpio[10];
 uint32_t suspend_gpio_cnt;
 static struct apio_info *suspend_apio;
 
+static uint8_t fdt_buffer[0x10000];
+
+void *plat_get_fdt(void)
+{
+       return &fdt_buffer[0];
+}
+
 struct gpio_info *plat_get_rockchip_gpio_reset(void)
 {
        return rst_gpio;
@@ -49,11 +57,30 @@ struct apio_info *plat_get_rockchip_suspend_apio(void)
        return suspend_apio;
 }
 
+static int dt_process_fdt(void *blob)
+{
+       void *fdt = plat_get_fdt();
+       int ret;
+
+       ret = fdt_open_into(blob, fdt, 0x10000);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 void params_early_setup(void *plat_param_from_bl2)
 {
        struct bl31_plat_param *bl2_param;
        struct bl31_gpio_param *gpio_param;
 
+       /*
+        * Test if this is a FDT passed as a platform-specific parameter
+        * block.
+        */
+       if (!dt_process_fdt(plat_param_from_bl2))
+               return;
+
        /* keep plat parameters for later processing if need */
        bl2_param = (struct bl31_plat_param *)plat_param_from_bl2;
        while (bl2_param) {
index ca6345b7ecb5814e7c981cfb21edf9d08630c754..18b1b9419ba08246c0dcc147c0b659abcf987bf7 100644 (file)
@@ -8,6 +8,8 @@ RK_PLAT                 :=      plat/rockchip
 RK_PLAT_SOC            :=      ${RK_PLAT}/${PLAT}
 RK_PLAT_COMMON         :=      ${RK_PLAT}/common
 
+include lib/libfdt/libfdt.mk
+
 PLAT_INCLUDES          :=      -Idrivers/arm/gic/common/                       \
                                -Idrivers/arm/gic/v2/                   \
                                -I${RK_PLAT_COMMON}/                            \
@@ -38,6 +40,7 @@ BL31_SOURCES          +=      ${RK_GIC_SOURCES}                               \
                                drivers/delay_timer/generic_delay_timer.c       \
                                lib/cpus/aarch64/aem_generic.S                  \
                                lib/cpus/aarch64/cortex_a53.S                   \
+                               $(LIBFDT_SRCS)                                  \
                                ${RK_PLAT_COMMON}/drivers/parameter/ddr_parameter.c     \
                                ${RK_PLAT_COMMON}/aarch64/plat_helpers.S        \
                                ${RK_PLAT_COMMON}/bl31_plat_setup.c             \
index c0164c1797dae8cafdaf0171424079a1133176f7..d1315fc580a19e5f4798d3042d6ba67004820cb4 100644 (file)
@@ -8,6 +8,8 @@ RK_PLAT                 :=      plat/rockchip
 RK_PLAT_SOC            :=      ${RK_PLAT}/${PLAT}
 RK_PLAT_COMMON         :=      ${RK_PLAT}/common
 
+include lib/libfdt/libfdt.mk
+
 PLAT_INCLUDES          :=      -I${RK_PLAT_COMMON}/                            \
                                -I${RK_PLAT_COMMON}/include/                    \
                                -I${RK_PLAT_COMMON}/pmusram                     \
@@ -35,6 +37,7 @@ BL31_SOURCES          +=      ${RK_GIC_SOURCES}                               \
                                drivers/delay_timer/delay_timer.c               \
                                drivers/delay_timer/generic_delay_timer.c       \
                                lib/cpus/aarch64/cortex_a53.S                   \
+                               $(LIBFDT_SRCS)                                  \
                                ${RK_PLAT_COMMON}/aarch64/plat_helpers.S        \
                                ${RK_PLAT_COMMON}/bl31_plat_setup.c             \
                                ${RK_PLAT_COMMON}/params_setup.c                \
index b624717dda7ff64137db4a3fb181fd3df3a0e581..101359856d3934769814fa2617f678e369709835 100644 (file)
@@ -8,6 +8,8 @@ RK_PLAT         :=      plat/rockchip
 RK_PLAT_SOC    :=      ${RK_PLAT}/${PLAT}
 RK_PLAT_COMMON :=      ${RK_PLAT}/common
 
+include lib/libfdt/libfdt.mk
+
 PLAT_INCLUDES          :=      -I${RK_PLAT_COMMON}/                    \
                                -I${RK_PLAT_COMMON}/include/            \
                                -I${RK_PLAT_COMMON}/pmusram             \
@@ -43,6 +45,7 @@ BL31_SOURCES  +=      ${RK_GIC_SOURCES}                               \
                        drivers/gpio/gpio.c                             \
                        lib/cpus/aarch64/cortex_a53.S                   \
                        lib/cpus/aarch64/cortex_a72.S                   \
+                       $(LIBFDT_SRCS)                                  \
                        ${RK_PLAT_COMMON}/aarch64/plat_helpers.S        \
                        ${RK_PLAT_COMMON}/bl31_plat_setup.c             \
                        ${RK_PLAT_COMMON}/params_setup.c                \